This file is used to analyse the ORS + IFE basal dataset.
library(dplyr)
library(patchwork)
library(ggplot2)
library(ComplexHeatmap)
.libPaths()
## [1] "/usr/local/lib/R/library"
In this section, we set the global settings of the analysis. We will store data there :
save_name = "ors_ifeb"
out_dir = "."
We load the dataset :
sobj = readRDS(paste0(out_dir, "/", save_name, "_sobj.rds"))
sobj
## An object of class Seurat
## 15543 features across 7987 samples within 1 assay
## Active assay: RNA (15543 features, 2000 variable features)
## 6 dimensional reductions calculated: RNA_pca, RNA_pca_19_tsne, RNA_pca_19_umap, harmony, harmony_19_umap, harmony_19_tsne
We load the sample information :
sample_info = readRDS(paste0(out_dir, "/../1_metadata/wu_sample_info.rds"))
project_names_oi = sample_info$project_name
graphics::pie(rep(1, nrow(sample_info)),
col = sample_info$color,
labels = sample_info$project_name)
Here are custom colors for each cell type :
color_markers = readRDS(paste0(out_dir, "/../../1_metadata/hs_hd_color_markers.rds"))
data.frame(cell_type = names(color_markers),
color = unlist(color_markers)) %>%
ggplot2::ggplot(., aes(x = cell_type, y = 0, fill = cell_type)) +
ggplot2::geom_point(pch = 21, size = 5) +
ggplot2::scale_fill_manual(values = unlist(color_markers), breaks = names(color_markers)) +
ggplot2::theme_classic() +
ggplot2::theme(legend.position = "none",
axis.line = element_blank(),
axis.title = element_blank(),
axis.ticks = element_blank(),
axis.text.y = element_blank(),
axis.text.x = element_text(angle = 30, hjust = 1))
This is the projection of interest :
name2D = "harmony_19_tsne"
We design a custom function to make the GSEA plot and a word cloud graph :
make_gsea_plot = function(gsea_results, gs_oi, fold_change, metric = "FC") {
fold_change$metric = fold_change[, metric]
plot_list = lapply(gs_oi, FUN = function(gene_set) {
# Gene set content
gs_content = gene_sets %>%
dplyr::filter(gs_name == gene_set) %>%
dplyr::pull(ensembl_gene) %>%
unique()
# Gene set size
nb_genes = length(gs_content)
# Enrichment metrics
NES = gsea_results@result[gene_set, "NES"]
p.adjust = gsea_results@result[gene_set, "p.adjust"] %>%
round(., 4)
qvalues = gsea_results@result[gene_set, "qvalues"]
if (p.adjust > 0.05) {
p.adjust = paste0("<span style='color:red;'>", p.adjust, "</span>")
}
my_subtitle = paste0("\nNES : ", round(NES, 2),
" | padj : ", p.adjust,
" | qval : ", round(qvalues, 4),
" | set size : ", nb_genes, " genes")
# Size limits
lower_FC = min(fold_change[gs_content, ]$metric, na.rm = TRUE)
upper_FC = max(fold_change[gs_content, ]$metric, na.rm = TRUE)
# Plot
p = enrichplot::gseaplot2(x = gsea_results, geneSetID = gene_set) +
ggplot2::labs(title = gene_set,
subtitle = my_subtitle) +
ggplot2::theme(plot.title = element_text(hjust = 0.5, face = "bold",
margin = ggplot2::margin(3, 3, 5, 3)),
plot.subtitle = ggtext::element_markdown(hjust = 0.5,
size = 10))
wc = ggplot2::ggplot(fold_change[gs_content, ],
aes(label = gene_name, size = abs(metric), color = metric)) +
ggwordcloud::geom_text_wordcloud_area(show.legend = TRUE) +
ggplot2::scale_color_gradient2(
name = metric,
low = aquarius::color_cnv[1],
mid = "gray70", midpoint = 0,
high = aquarius::color_cnv[3]) +
ggplot2::scale_size_area(max_size = 7) +
ggplot2::theme_minimal() +
ggplot2::guides(size = "none")
return(list(p, wc))
}) %>% unlist(., recursive = FALSE)
return(plot_list)
}
We visualize gene expression for some markers :
features = c("percent.mt", "percent.rb", "nFeature_RNA")
plot_list = lapply(features, FUN = function(one_gene) {
Seurat::FeaturePlot(sobj, features = one_gene,
reduction = name2D) +
ggplot2::theme(aspect.ratio = 1) +
ggplot2::scale_color_gradientn(colors = aquarius::color_gene) +
Seurat::NoAxes()
})
patchwork::wrap_plots(plot_list, ncol = 3)
We visualize clusters :
cluster_plot = Seurat::DimPlot(sobj, reduction = name2D, label = TRUE) +
Seurat::NoAxes() +
ggplot2::theme(aspect.ratio = 1)
cluster_plot
We visualize cell type split by sample :
plot_list = aquarius::plot_split_dimred(sobj,
reduction = name2D,
split_by = "project_name",
group_by = "cell_type",
split_color = setNames(sample_info$color,
nm = sample_info$project_name),
group_color = color_markers,
bg_pt_size = 0.5, main_pt_size = 0.5)
plot_list[[length(plot_list) + 1]] = cluster_plot
patchwork::wrap_plots(plot_list, ncol = 4) &
Seurat::NoLegend()
We summarize major cell type by cluster :
cell_type_clusters = sobj@meta.data[, c("cell_type", "seurat_clusters")] %>%
table() %>%
prop.table(., margin = 2) %>%
apply(., 2, which.max)
cell_type_clusters = setNames(levels(sobj$cell_type)[cell_type_clusters],
nm = names(cell_type_clusters))
We define cluster type :
sobj$cluster_type = cell_type_clusters[sobj$seurat_clusters] %>%
as.factor()
table(sobj$cluster_type, sobj$cell_type)
##
## CD4 T cells CD8 T cells Langerhans cells macrophages B cells
## IFE basal 1 3 0 0 12
## ORS 3 0 3 0 7
## proliferative 0 0 0 0 0
##
## cuticle cortex medulla IRS proliferative HF-SCs IFE basal
## IFE basal 2 1 0 0 3 85 956
## ORS 40 71 17 15 9 44 12
## proliferative 0 0 0 0 52 2 1
##
## IFE granular spinous ORS sebocytes
## IFE basal 6 6 56
## ORS 195 6306 31
## proliferative 0 48 0
We subset color_markers :
color_markers = color_markers[levels(sobj$cluster_type)]
We compare cluster annotation and cell type annotation :
p1 = Seurat::DimPlot(sobj, group.by = "cell_type",
reduction = name2D, cols = color_markers) +
ggplot2::labs(title = "Cell type") +
Seurat::NoAxes() +
ggplot2::theme(aspect.ratio = 1,
plot.title = element_text(hjust = 0.5))
p2 = Seurat::DimPlot(sobj, group.by = "cluster_type",
reduction = name2D, cols = color_markers) +
ggplot2::labs(title = "Cluster type") +
Seurat::NoAxes() +
ggplot2::theme(aspect.ratio = 1,
plot.title = element_text(hjust = 0.5))
patchwork::wrap_plots(p1, p2, guides = "collect")
We make a barplot to compare ORS and IFE basal populations in HS vs HD samples. The proportion of ORS is indicated on top of bars.
quantif = table(sobj$sample_identifier,
sobj$cluster_type) %>%
as.data.frame.table() %>%
`colnames<-`(c("Sample", "cell_type", "nb_cells")) %>%
dplyr::group_by(Sample) %>%
dplyr::mutate(total_cells = sum(nb_cells)) %>%
as.data.frame() %>%
dplyr::filter(cell_type == "ORS") %>%
dplyr::mutate(prop_ibl = nb_cells / total_cells) %>%
dplyr::mutate(prop_ibl = 100*round(prop_ibl, 4))
sobj$seurat_clusters = factor(sobj$seurat_clusters,
levels = names(sort(cell_type_clusters)))
aquarius::plot_barplot(df = table(sobj$sample_identifier,
sobj$seurat_clusters) %>%
as.data.frame.table() %>%
`colnames<-`(c("sample_identifier", "clusters", "nb_cells")),
x = "sample_identifier", y = "nb_cells", fill = "clusters",
position = position_fill()) +
ggplot2::scale_fill_manual(values = c(colorRampPalette(c("royalblue1", "royalblue4"))(table(sort(cell_type_clusters))["IFE basal"]),
colorRampPalette(c("chartreuse1", "chartreuse4"))(table(sort(cell_type_clusters))["ORS"]),
colorRampPalette(c("gray50", "black"))(table(sort(cell_type_clusters))["proliferative"])),
breaks = names(sort(cell_type_clusters)),
name = "Cell type") +
ggplot2::geom_label(data = quantif, inherit.aes = FALSE,
aes(x = .data$Sample, y = 1.05, label = .data$prop_ibl),
label.size = 0, size = 5)
In this section, we perform DE between inner bulge layer (ORS) and outer root sheath (IFE basal) populations.
We save the results in a list :
list_results = list()
We make over-representation analysis for each group of genes. We load gene sets from MSigDB :
gene_sets = aquarius::get_gene_sets(species = "Homo sapiens")
gene_sets = gene_sets$gene_sets
head(gene_sets)
## # A tibble: 6 x 16
## gs_cat gs_subcat gs_name gene_symbol entrez_gene ensembl_gene human_gene_symb~
## <chr> <chr> <chr> <chr> <int> <chr> <chr>
## 1 C5 GO:BP GOBP_1~ AASDHPPT 60496 ENSG0000014~ AASDHPPT
## 2 C5 GO:BP GOBP_1~ ALDH1L1 10840 ENSG0000014~ ALDH1L1
## 3 C5 GO:BP GOBP_1~ ALDH1L2 160428 ENSG0000013~ ALDH1L2
## 4 C5 GO:BP GOBP_1~ MTHFD1 4522 ENSG0000010~ MTHFD1
## 5 C5 GO:BP GOBP_1~ MTHFD1L 25902 ENSG0000012~ MTHFD1L
## 6 C5 GO:BP GOBP_1~ MTHFD2L 441024 ENSG0000016~ MTHFD2L
## # ... with 9 more variables: human_entrez_gene <int>, human_ensembl_gene <chr>,
## # gs_id <chr>, gs_pmid <chr>, gs_geoid <chr>, gs_exact_source <chr>,
## # gs_url <chr>, gs_description <chr>, category <chr>
How many gene sets ?
gene_sets[, c("gs_subcat", "gs_name")] %>%
dplyr::distinct() %>%
dplyr::pull(gs_subcat) %>%
table() %>%
as.data.frame.table() %>%
`colnames<-`(c("Category", "Nb gene sets"))
## Category Nb gene sets
## 1 50
## 2 CP:KEGG 186
## 3 CP:PID 196
## 4 CP:REACTOME 1615
## 5 CP:WIKIPATHWAYS 664
## 6 GO:BP 7658
## 7 GO:CC 1006
## 8 GO:MF 1738
We get gene name and gene ID correspondence :
gene_corresp = sobj@assays[["RNA"]]@meta.features[, c("gene_name", "Ensembl_ID")] %>%
`colnames<-`(c("NAME", "ID")) %>%
dplyr::mutate(ID = as.character(ID))
rownames(gene_corresp) = gene_corresp$ID
head(gene_corresp)
## NAME ID
## ENSG00000238009 AL627309.1 ENSG00000238009
## ENSG00000237491 AL669831.5 ENSG00000237491
## ENSG00000225880 LINC00115 ENSG00000225880
## ENSG00000230368 FAM41C ENSG00000230368
## ENSG00000223764 AL645608.1 ENSG00000223764
## ENSG00000187634 SAMD11 ENSG00000187634
group_name = "ORS_vs_IFE_basal"
We change cell identities to cluster type :
Seurat::Idents(sobj) = sobj$cluster_type
table(Seurat::Idents(sobj))
##
## IFE basal ORS proliferative
## 1131 6753 103
We identify specific markers for each population :
mark = Seurat::FindMarkers(sobj, ident.1 = "ORS", ident.2 = "IFE basal")
mark = mark %>%
dplyr::filter(p_val_adj < 0.05) %>%
dplyr::arrange(-avg_logFC, pct.1 - pct.2)
list_results[[group_name]]$mark = mark
dim(mark)
## [1] 934 5
head(mark, n = 20)
## p_val avg_logFC pct.1 pct.2 p_val_adj
## KRT16 0.000000e+00 3.709021 0.995 0.605 0.000000e+00
## FABP5 0.000000e+00 3.280278 0.996 0.632 0.000000e+00
## KRT6B 0.000000e+00 2.906639 0.987 0.521 0.000000e+00
## KRT6C 0.000000e+00 2.774668 0.925 0.150 0.000000e+00
## KRT6A 0.000000e+00 2.754484 0.916 0.508 0.000000e+00
## KRT17 0.000000e+00 2.042004 0.996 0.885 0.000000e+00
## CST6 8.994683e-93 2.018186 0.948 0.894 1.398044e-88
## GJA1 0.000000e+00 1.935267 0.955 0.452 0.000000e+00
## LYPD3 0.000000e+00 1.882801 0.867 0.207 0.000000e+00
## S100A1 4.916157e-284 1.875505 0.682 0.070 7.641183e-280
## SDC1 0.000000e+00 1.874512 0.933 0.513 0.000000e+00
## SBSN 5.135312e-244 1.681081 0.786 0.349 7.981815e-240
## MUCL1 4.277381e-13 1.636175 0.107 0.039 6.648333e-09
## CALML3 0.000000e+00 1.608928 0.995 0.892 0.000000e+00
## CRABP2 9.789555e-303 1.536519 0.733 0.105 1.521591e-298
## GJB6 0.000000e+00 1.535635 0.888 0.543 0.000000e+00
## CALML5 4.173409e-109 1.524474 0.697 0.420 6.486730e-105
## S100A2 0.000000e+00 1.424614 0.989 0.996 0.000000e+00
## PDZRN3 4.637402e-293 1.416534 0.676 0.037 7.207914e-289
## DSP 0.000000e+00 1.406052 0.958 0.800 0.000000e+00
There are 934 genes differentially expressed. How many for each population ?
# ORS
mark_ibl = mark %>%
dplyr::filter(avg_logFC > 0)
nrow(mark_ibl)
## [1] 505
# IFE basal
mark_ors = mark %>%
dplyr::filter(avg_logFC < 0)
nrow(mark_ors)
## [1] 429
We represent the information on a figure :
mark$gene_name = rownames(mark)
mark_to_label = rbind(
# up-regulated in ORS
mark %>% dplyr::top_n(., n = 20, wt = avg_logFC),
# up-regulated in IFE basal
mark %>% dplyr::top_n(., n = 20, wt = -avg_logFC),
# representative and selective for ORS
mark %>% dplyr::top_n(., n = 20, wt = (pct.1 - pct.2)),
# representative and selective for IFE basal
mark %>% dplyr::top_n(., n = 20, wt = -(pct.1 - pct.2))) %>%
dplyr::distinct()
ggplot2::ggplot(mark, aes(x = pct.1, y = pct.2, col = avg_logFC)) +
ggplot2::geom_abline(slope = 1, intercept = 0, lty = 2) +
ggplot2::geom_point() +
ggrepel::geom_label_repel(data = mark_to_label, max.overlaps = Inf,
aes(x = pct.1, y = pct.2, label = gene_name),
col = "black", fill = NA, size = 3, label.size = NA) +
ggplot2::labs(title = "Differentially expressed genes",
subtitle = "between ORS and IFE basal") +
ggplot2::scale_color_gradient2(low = aquarius::color_cnv[1],
mid = aquarius::color_cnv[2],
high = aquarius::color_cnv[3],
midpoint = 0) +
ggplot2::theme_classic() +
ggplot2::theme(plot.title = element_text(hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5))
We explore enrichment in gene sets for ORS population
genes_of_interest = rownames(mark_ibl)
enrichr_results = aquarius::run_enrichr(gene_names = genes_of_interest,
gene_corresp = gene_corresp,
gene_sets = gene_sets[, c("gs_name", "ensembl_gene")],
make_plot = TRUE,
plot_title = "Up-regulated in ORS compared to IFE basal")
list_results[[group_name]]$enrichr_ibl = enrichr_results$ego
enrichr_results$plot +
ggplot2::theme(axis.text.y = element_text(size = 8))
We explore enrichment in gene sets for IFE basal population.
genes_of_interest = rownames(mark_ors)
enrichr_results = aquarius::run_enrichr(gene_names = genes_of_interest,
gene_corresp = gene_corresp,
gene_sets = gene_sets[, c("gs_name", "ensembl_gene")],
make_plot = TRUE,
plot_title = "Up-regulated in IFE basal compared to ORS")
list_results[[group_name]]$enrichr_ors = enrichr_results$ego
enrichr_results$plot +
ggplot2::theme(axis.text.y = element_text(size = 8))
We run a GSEA for all gene sets, from the full count matrix :
ranked_gene_list = aquarius::run_foldchange(Seurat::GetAssayData(sobj, assay = "RNA", slot = "counts"),
group1 = colnames(sobj)[sobj@active.ident %in% "ORS"],
group2 = colnames(sobj)[sobj@active.ident %in% "IFE basal"])
names(ranked_gene_list) = gene_corresp$ID
gsea_results = aquarius::gsea_run(ranked_gene_list = ranked_gene_list,
gene_sets = gene_sets[, c("gs_name", "ensembl_gene")],
GSEA_p_val_thresh = 1)
list_results[[group_name]]$gsea = gsea_results
gsea_results@result %>%
dplyr::filter(pvalue < 0.05) %>%
dplyr::top_n(., n = 200, wt = abs(NES)) %>%
dplyr::mutate(too_long = ifelse(nchar(ID) > 60, yes = TRUE, no = FALSE)) %>%
dplyr::mutate(ID = stringr::str_sub(ID, end = 60)) %>%
dplyr::mutate(ID = ifelse(too_long, yes = paste0(ID, "..."), no = ID)) %>%
aquarius::gsea_plot(show_legend = TRUE) +
ggplot2::labs(title = "GSEA using all genes (count matrix)") +
ggplot2::theme(plot.title = element_text(size = 20))
We make the gsea plot for two gene sets :
p1 = enrichplot::gseaplot2(x = gsea_results, geneSetID = "REACTOME_KERATINIZATION") +
ggplot2::labs(title = "REACTOME_KERATINIZATION") +
ggplot2::theme(plot.title = element_text(hjust = 0.5, face = "bold",
margin = ggplot2::margin(3, 3, 5, 3)))
p2 = enrichplot::gseaplot2(x = gsea_results, geneSetID = "HALLMARK_INTERFERON_GAMMA_RESPONSE") +
ggplot2::labs(title = "HALLMARK_INTERFERON_GAMMA_RESPONSE") +
ggplot2::theme(plot.title = element_text(hjust = 0.5, face = "bold",
margin = ggplot2::margin(3, 3, 5, 3)))
p1 | p2
We save the list of results :
saveRDS(list_results, file = paste0(out_dir, "/", save_name, "_list_results.rds"))
## R version 3.6.3 (2020-02-29)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 20.04.6 LTS
##
## Matrix products: default
## BLAS: /usr/local/lib/R/lib/libRblas.so
## LAPACK: /usr/local/lib/R/lib/libRlapack.so
##
## locale:
## [1] C
##
## attached base packages:
## [1] grid stats graphics grDevices utils datasets methods
## [8] base
##
## other attached packages:
## [1] ComplexHeatmap_2.14.0 ggplot2_3.3.5 patchwork_1.1.2
## [4] dplyr_1.0.7
##
## loaded via a namespace (and not attached):
## [1] softImpute_1.4 graphlayouts_0.7.0
## [3] pbapply_1.4-2 lattice_0.20-41
## [5] haven_2.3.1 vctrs_0.3.8
## [7] usethis_2.0.1 dynwrap_1.2.1
## [9] blob_1.2.1 survival_3.2-13
## [11] prodlim_2019.11.13 dynutils_1.0.5
## [13] later_1.3.0 DBI_1.1.1
## [15] R.utils_2.11.0 SingleCellExperiment_1.8.0
## [17] rappdirs_0.3.3 uwot_0.1.8
## [19] dqrng_0.2.1 jpeg_0.1-8.1
## [21] zlibbioc_1.32.0 pspline_1.0-18
## [23] pcaMethods_1.78.0 mvtnorm_1.1-1
## [25] htmlwidgets_1.5.4 GlobalOptions_0.1.2
## [27] future_1.22.1 UpSetR_1.4.0
## [29] laeken_0.5.2 leiden_0.3.3
## [31] clustree_0.4.3 parallel_3.6.3
## [33] scater_1.14.6 irlba_2.3.3
## [35] DEoptimR_1.0-9 tidygraph_1.1.2
## [37] Rcpp_1.0.9 readr_2.0.2
## [39] KernSmooth_2.23-17 carrier_0.1.0
## [41] promises_1.1.0 gdata_2.18.0
## [43] DelayedArray_0.12.3 limma_3.42.2
## [45] graph_1.64.0 RcppParallel_5.1.4
## [47] Hmisc_4.4-0 fs_1.5.2
## [49] RSpectra_0.16-0 fastmatch_1.1-0
## [51] ranger_0.12.1 digest_0.6.25
## [53] png_0.1-7 sctransform_0.2.1
## [55] cowplot_1.0.0 DOSE_3.12.0
## [57] here_1.0.1 TInGa_0.0.0.9000
## [59] ggraph_2.0.3 pkgconfig_2.0.3
## [61] GO.db_3.10.0 DelayedMatrixStats_1.8.0
## [63] gower_0.2.1 ggbeeswarm_0.6.0
## [65] iterators_1.0.12 DropletUtils_1.6.1
## [67] reticulate_1.26 clusterProfiler_3.14.3
## [69] SummarizedExperiment_1.16.1 circlize_0.4.15
## [71] beeswarm_0.4.0 GetoptLong_1.0.5
## [73] xfun_0.35 bslib_0.3.1
## [75] zoo_1.8-10 tidyselect_1.1.0
## [77] reshape2_1.4.4 purrr_0.3.4
## [79] ica_1.0-2 pcaPP_1.9-73
## [81] viridisLite_0.3.0 rtracklayer_1.46.0
## [83] rlang_1.0.2 hexbin_1.28.1
## [85] jquerylib_0.1.4 dyneval_0.9.9
## [87] glue_1.4.2 RColorBrewer_1.1-2
## [89] matrixStats_0.56.0 stringr_1.4.0
## [91] lava_1.6.7 europepmc_0.3
## [93] DESeq2_1.26.0 recipes_0.1.17
## [95] labeling_0.3 httpuv_1.5.2
## [97] class_7.3-17 BiocNeighbors_1.4.2
## [99] DO.db_2.9 annotate_1.64.0
## [101] jsonlite_1.7.2 XVector_0.26.0
## [103] bit_4.0.4 mime_0.9
## [105] aquarius_0.1.5 Rsamtools_2.2.3
## [107] gridExtra_2.3 gplots_3.0.3
## [109] stringi_1.4.6 processx_3.5.2
## [111] gsl_2.1-6 bitops_1.0-6
## [113] cli_3.0.1 batchelor_1.2.4
## [115] RSQLite_2.2.0 randomForest_4.6-14
## [117] tidyr_1.1.4 data.table_1.14.2
## [119] rstudioapi_0.13 org.Mm.eg.db_3.10.0
## [121] GenomicAlignments_1.22.1 nlme_3.1-147
## [123] qvalue_2.18.0 scran_1.14.6
## [125] locfit_1.5-9.4 scDblFinder_1.1.8
## [127] listenv_0.8.0 ggthemes_4.2.4
## [129] gridGraphics_0.5-0 R.oo_1.24.0
## [131] dbplyr_1.4.4 BiocGenerics_0.32.0
## [133] TTR_0.24.2 readxl_1.3.1
## [135] lifecycle_1.0.1 timeDate_3043.102
## [137] ggpattern_0.3.1 munsell_0.5.0
## [139] cellranger_1.1.0 R.methodsS3_1.8.1
## [141] proxyC_0.1.5 visNetwork_2.0.9
## [143] caTools_1.18.0 codetools_0.2-16
## [145] Biobase_2.46.0 GenomeInfoDb_1.22.1
## [147] vipor_0.4.5 lmtest_0.9-38
## [149] msigdbr_7.5.1 htmlTable_1.13.3
## [151] triebeard_0.3.0 lsei_1.2-0
## [153] xtable_1.8-4 ROCR_1.0-7
## [155] BiocManager_1.30.10 scatterplot3d_0.3-41
## [157] abind_1.4-5 farver_2.0.3
## [159] parallelly_1.28.1 RANN_2.6.1
## [161] askpass_1.1 GenomicRanges_1.38.0
## [163] RcppAnnoy_0.0.16 tibble_3.1.5
## [165] ggdendro_0.1-20 cluster_2.1.0
## [167] future.apply_1.5.0 Seurat_3.1.5
## [169] dendextend_1.15.1 Matrix_1.3-2
## [171] ellipsis_0.3.2 prettyunits_1.1.1
## [173] lubridate_1.7.9 ggridges_0.5.2
## [175] igraph_1.2.5 RcppEigen_0.3.3.7.0
## [177] fgsea_1.12.0 remotes_2.4.2
## [179] scBFA_1.0.0 destiny_3.0.1
## [181] VIM_6.1.1 testthat_3.1.0
## [183] htmltools_0.5.2 BiocFileCache_1.10.2
## [185] yaml_2.2.1 utf8_1.1.4
## [187] plotly_4.9.2.1 XML_3.99-0.3
## [189] ModelMetrics_1.2.2.2 e1071_1.7-3
## [191] foreign_0.8-76 withr_2.5.0
## [193] fitdistrplus_1.0-14 BiocParallel_1.20.1
## [195] xgboost_1.4.1.1 bit64_4.0.5
## [197] foreach_1.5.0 robustbase_0.93-9
## [199] Biostrings_2.54.0 GOSemSim_2.13.1
## [201] rsvd_1.0.3 memoise_2.0.0
## [203] evaluate_0.18 forcats_0.5.0
## [205] rio_0.5.16 geneplotter_1.64.0
## [207] tzdb_0.1.2 caret_6.0-86
## [209] ps_1.6.0 DiagrammeR_1.0.6.1
## [211] curl_4.3 fdrtool_1.2.15
## [213] fansi_0.4.1 highr_0.8
## [215] urltools_1.7.3 xts_0.12.1
## [217] GSEABase_1.48.0 acepack_1.4.1
## [219] edgeR_3.28.1 checkmate_2.0.0
## [221] scds_1.2.0 cachem_1.0.6
## [223] npsurv_0.4-0 babelgene_22.3
## [225] rjson_0.2.20 openxlsx_4.1.5
## [227] ggrepel_0.9.1 clue_0.3-60
## [229] rprojroot_2.0.2 stabledist_0.7-1
## [231] tools_3.6.3 sass_0.4.0
## [233] nichenetr_1.1.1 magrittr_2.0.1
## [235] RCurl_1.98-1.2 proxy_0.4-24
## [237] car_3.0-11 ape_5.3
## [239] ggplotify_0.0.5 xml2_1.3.2
## [241] httr_1.4.2 assertthat_0.2.1
## [243] rmarkdown_2.18 boot_1.3-25
## [245] globals_0.14.0 R6_2.4.1
## [247] Rhdf5lib_1.8.0 nnet_7.3-14
## [249] RcppHNSW_0.2.0 progress_1.2.2
## [251] genefilter_1.68.0 statmod_1.4.34
## [253] gtools_3.8.2 shape_1.4.6
## [255] HDF5Array_1.14.4 BiocSingular_1.2.2
## [257] rhdf5_2.30.1 splines_3.6.3
## [259] AUCell_1.8.0 carData_3.0-4
## [261] colorspace_1.4-1 generics_0.1.0
## [263] stats4_3.6.3 base64enc_0.1-3
## [265] dynfeature_1.0.0 smoother_1.1
## [267] gridtext_0.1.1 pillar_1.6.3
## [269] tweenr_1.0.1 sp_1.4-1
## [271] ggplot.multistats_1.0.0 rvcheck_0.1.8
## [273] GenomeInfoDbData_1.2.2 plyr_1.8.6
## [275] gtable_0.3.0 zip_2.2.0
## [277] knitr_1.41 latticeExtra_0.6-29
## [279] biomaRt_2.42.1 IRanges_2.20.2
## [281] fastmap_1.1.0 ADGofTest_0.3
## [283] copula_1.0-0 doParallel_1.0.15
## [285] AnnotationDbi_1.48.0 vcd_1.4-8
## [287] babelwhale_1.0.1 openssl_1.4.1
## [289] scales_1.1.1 backports_1.2.1
## [291] S4Vectors_0.24.4 ipred_0.9-12
## [293] enrichplot_1.6.1 hms_1.1.1
## [295] ggforce_0.3.1 Rtsne_0.15
## [297] shiny_1.7.1 numDeriv_2016.8-1.1
## [299] polyclip_1.10-0 lazyeval_0.2.2
## [301] Formula_1.2-3 tsne_0.1-3
## [303] crayon_1.3.4 MASS_7.3-54
## [305] pROC_1.16.2 viridis_0.5.1
## [307] dynparam_1.0.0 rpart_4.1-15
## [309] zinbwave_1.8.0 compiler_3.6.3
## [311] ggtext_0.1.0